home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / pstools / psbook.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  15.3 KB  |  659 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    psbook -
  19.  *        A PostScript book generation program
  20.  *
  21.  *    To compile:
  22.  *        cc psbook.c -o psbook 
  23.  *
  24.  *                Paul Haeberli - 1993
  25.  */
  26. #include "stdio.h"
  27. #include "math.h"
  28. #include "ctype.h"
  29.  
  30. /* printer specific tuning */
  31. #define FRONTXFUDGE    (72.0*-0.020)    /* front offset for our lazer printer */
  32. #define FRONTYFUDGE    (72.0* 0.020)
  33. #define BACKXFUDGE    (72.0* 0.010)    /*  back offset for our lazer printer */
  34. #define BACKYFUDGE    (72.0* 0.070)
  35.  
  36. /* paper specific tuning */
  37. #define CREAPPERSHEET    (72.0*(0.04/6.0))   /* creap per sheet */
  38.  
  39. #define DEFPWIDTH     (72.0*8.50)    /* page width and weight */
  40. #define DEFPHEIGHT     (72.0*11.0)
  41.  
  42. #define SWIDTH         (72.0*8.50)    /* sheet width and height */
  43. #define SHEIGHT     (72.0*11.0)
  44.  
  45. #define MARGIN         (72.0*0.2)    /* margin amount */
  46. #define SPMARGIN     (72.0*0.25)    /* page spread margin */
  47. #define BLEED         (72.0*0.25)    /* bleed amount */
  48.  
  49. #define FRONTSIDE    (0)
  50. #define BACKSIDE    (1)
  51.  
  52. #define RIGHTPAGE    (0)
  53. #define LEFTPAGE    (1)
  54. #define CENTERPAGE    (2)
  55. #define SPRIGHTPAGE    (3)
  56. #define SPLEFTPAGE    (4)
  57.  
  58. #define BOTSIG        (0)
  59. #define TOPSIG        (1)
  60.  
  61. #define INBUFSIZE    4096
  62. #define MAXPAGES    1000
  63.  
  64. #define FOLD0DX        (SWIDTH)
  65. #define FOLD0DY        (SHEIGHT)
  66.  
  67. #define FOLD1DX        (SHEIGHT/2.0-MARGIN)
  68. #define FOLD1DY        (SWIDTH-2*MARGIN)
  69.  
  70. #define FOLD2DX        (SWIDTH/2.0-MARGIN)
  71. #define FOLD2DY        (SHEIGHT/2.0-2*MARGIN)
  72.  
  73. char buf[INBUFSIZE];
  74. int secstart[MAXPAGES];
  75. int secend[MAXPAGES];
  76. int trailstart;
  77. int trailend;
  78. float pdx, pdy, pscale;
  79. float pwidth, pheight, xoffset, yoffset, dxoffset;
  80.  
  81. void printheader(dosettrans)
  82. int dosettrans;
  83. {
  84.     printf("%%!PS-Adobe-2.0\n");
  85.     printf("%%%%EndComments\n");
  86.     printf("/REALshowpage /showpage load def\n"); 
  87.     printf("/showpage { } def\n");
  88.     if(dosettrans)
  89.     psprintcortab();
  90. }
  91.  
  92. int indexpages(inf)
  93. FILE *inf;
  94. {
  95.     int i, n, before, after;
  96.  
  97.     n = 0;
  98.     trailstart = 0;
  99.     trailend = 0;
  100.     while(fgets(buf,INBUFSIZE,inf)) {
  101.     if(strncmp(buf,"%%Page:",7) == 0) {
  102.         after = ftell(inf);
  103.         if(n>0)
  104.         secend[n-1] = before;
  105.         secstart[n] = after; 
  106.         n++;
  107.     } else if(strncmp(buf,"%%Trailer",9) == 0) {
  108.         after = ftell(inf);
  109.         if(n>0)
  110.         secend[n-1] = before;
  111.         trailstart = after;
  112.         trailend = sizeoffile(inf);
  113.         return n;
  114.     }
  115.     before = ftell(inf);
  116.     }
  117.     secend[n-1] = ftell(inf);
  118.     return n;
  119. }
  120.  
  121. void putsection(inf,start,nbytes)
  122. FILE *inf;
  123. int start, nbytes;
  124. {
  125.     int nr;
  126.  
  127.     fseek(inf,start,0);
  128.     while(nbytes>0) {
  129.     if(!fgets(buf,INBUFSIZE,inf)) {
  130.         fprintf(stderr,"psbook: bad read in putsection\n");
  131.         exit(1);
  132.     }
  133.     nr = strlen(buf);
  134.     nbytes -= nr;
  135.     if(buf[0] != '%')
  136.         fputs(buf,stdout);
  137.     }
  138.     if(nbytes != 0) {
  139.     fprintf(stderr,"psbook: strange read in putsection %d\n",nbytes);
  140.     exit(1);
  141.     }
  142. }
  143.  
  144. void putmark(x,y,rot)
  145. float x, y, rot;
  146. {
  147.     printf("gsave\n");
  148.     printf("0.1 setlinewidth\n");
  149.     printf("%f %f translate\n",x,y);
  150.     printf("%f rotate\n",rot);
  151.     printf("newpath\n");
  152.     printf("8 0 moveto\n");
  153.     printf("40 0 lineto\n");
  154.     printf("0 8 moveto\n");
  155.     printf("0 40 lineto\n");
  156.     printf("stroke\n");
  157.     printf("grestore\n");
  158. }
  159.  
  160. void putfold(x,y,rot)
  161. float x, y, rot;
  162. {
  163.     printf("gsave\n");
  164.     printf("0.1 setlinewidth\n");
  165.     printf("%f %f translate\n",x,y);
  166.     printf("%f rotate\n",rot);
  167.     printf("newpath\n");
  168.     printf("8 0 moveto\n");
  169.     printf("40 0 lineto\n");
  170.     printf("stroke\n");
  171.     printf("grestore\n");
  172. }
  173.  
  174. void xshift(page) 
  175. int page;
  176. {
  177.     float xoff, yoff;
  178.  
  179.     if(page&1)
  180.     xoff = xoffset+dxoffset;
  181.     else
  182.     xoff = xoffset-dxoffset;
  183.     yoff = yoffset;
  184.     printf("%f %f translate\n",xoff,yoff);
  185. }
  186.  
  187. void setclip(inf,page,spdx,spdy)
  188. FILE *inf;
  189. int page;
  190. float spdx, spdy;
  191. {
  192.     switch(page) {
  193.     case RIGHTPAGE:
  194.         putfold(spdx/2.0,(spdy-pdy)/2.0,270.0);
  195.         putfold(spdx/2.0,(spdy+pdy)/2.0,90.0);
  196.         putmark(spdx/2.0+pdx,(spdy-pdy)/2.0,270.0);
  197.         putmark(spdx/2.0+pdx,(spdy+pdy)/2.0,0.0);
  198.         printf("%f %f translate\n",spdx/2.0,(spdy-pdy)/2.0);
  199.         printf("%f %f scale\n",pscale,pscale);
  200.         printf("newpath\n");
  201.         printf("%f %f moveto\n",0.0,-BLEED);
  202.         printf("%f %f lineto\n",pwidth+BLEED,-BLEED);
  203.         printf("%f %f lineto\n",pwidth+BLEED,pheight+BLEED);
  204.         printf("%f %f lineto\n",0.0,pheight+BLEED);
  205.         printf("closepath clip newpath\n");
  206.         break;
  207.     case LEFTPAGE:
  208.         putfold(spdx/2.0,(spdy-pdy)/2.0,270.0);
  209.         putfold(spdx/2.0,(spdy+pdy)/2.0,90.0);
  210.         putmark(spdx/2.0-pdx,(spdy-pdy)/2.0,180.0);
  211.         putmark(spdx/2.0-pdx,(spdy+pdy)/2.0,90.0);
  212.         printf("%f %f translate\n",spdx/2.0-pdx,(spdy-pdy)/2.0);
  213.         printf("%f %f scale\n",pscale,pscale);
  214.         printf("newpath\n");
  215.         printf("%f %f moveto\n",-BLEED,-BLEED);
  216.         printf("%f %f lineto\n",pwidth,-BLEED);
  217.         printf("%f %f lineto\n",pwidth,pheight+BLEED);
  218.         printf("%f %f lineto\n",-BLEED,pheight+BLEED);
  219.         printf("closepath clip newpath\n");
  220.         break;
  221.     case CENTERPAGE:
  222.         putmark((spdx+pdx)/2.0,(spdy+pdy)/2.0,0.0);
  223.         putmark((spdx-pdx)/2.0,(spdy+pdy)/2.0,90.0);
  224.         putmark((spdx-pdx)/2.0,(spdy-pdy)/2.0,180.0);
  225.         putmark((spdx+pdx)/2.0,(spdy-pdy)/2.0,270.0);
  226.         printf("%f %f translate\n",(spdx-pdx)/2.0,(spdy-pdy)/2.0);
  227.         printf("%f %f scale\n",pscale,pscale);
  228.         printf("newpath\n");
  229.         printf("%f %f moveto\n",-BLEED,-BLEED);
  230.         printf("%f %f lineto\n",pwidth+BLEED,-BLEED);
  231.         printf("%f %f lineto\n",pwidth+BLEED,pheight+BLEED);
  232.         printf("%f %f lineto\n",-BLEED,pheight+BLEED);
  233.         printf("closepath clip newpath\n");
  234.         break;
  235.     }
  236.     xshift(page);
  237.     putsection(inf,0,secstart[0]);
  238. }
  239.  
  240. void putpage(inf,pageno,npages)
  241. FILE *inf;
  242. int pageno, npages;
  243. {
  244.     int nbytes;
  245.  
  246.     if(pageno<npages && pageno>=0) {
  247.     nbytes = secend[pageno]-secstart[pageno];
  248.     putsection(inf,secstart[pageno],nbytes);
  249.     }
  250. }
  251.  
  252. void dosave(inf)
  253. FILE *inf;
  254. {
  255.     printf("gsave\n");
  256. }
  257.  
  258. void dorestore(inf)
  259. FILE *inf;
  260. {
  261.     if(trailstart) 
  262.     putsection(inf,trailstart,trailend-trailstart);
  263.     printf("grestore\n"); 
  264. }
  265.  
  266. void spreadpage(inf,x,y,sx,sy,page,pageno,npages)
  267. FILE *inf;
  268. int x, y;
  269. float sx, sy;
  270. int page, pageno, npages;
  271. {
  272.     float pdx2;
  273.  
  274.     if(pageno<npages && pageno>=0) {
  275.     pdx2 = 2*pdx;
  276.     printf("gsave\n");
  277.     printf("%f %f translate\n",SWIDTH,0.0);
  278.     printf("90 rotate\n");
  279.     if(page == SPLEFTPAGE) 
  280.         printf("%f %f translate\n",sx+x*(sx+pdx2)+0*pdx,sy+y*(sy+pdy));
  281.     else 
  282.         printf("%f %f translate\n",sx+x*(sx+pdx2)+1*pdx,sy+y*(sy+pdy));
  283.     printf("%f %f scale\n",pscale,pscale);
  284.  
  285.     dosave(inf);
  286.     printf("newpath\n");
  287.     printf("%f %f moveto\n",0.0,0.0);
  288.     printf("%f %f lineto\n",pwidth,0.0);
  289.     printf("%f %f lineto\n",pwidth,pheight);
  290.     printf("%f %f lineto\n",0.0,pheight);
  291.     printf("closepath clip newpath\n");
  292.     xshift(pageno);
  293.     putsection(inf,0,secstart[0]);
  294.     putpage(inf,pageno,npages);
  295.     dorestore(inf);
  296.  
  297.     printf("0.1 setlinewidth\n");
  298.     printf("newpath\n");
  299.     printf("%f %f moveto\n",0.0,0.0);
  300.     printf("%f %f lineto\n",pwidth,0.0);
  301.     printf("%f %f lineto\n",pwidth,pheight);
  302.     printf("%f %f lineto\n",0.0,pheight);
  303.     printf("closepath stroke\n");
  304.     printf("grestore\n");
  305.     }
  306. }
  307.  
  308. void spread(inf,npages)
  309. FILE *inf;
  310. int npages;
  311. {
  312.     int nx, ny, spreadsper, nspreads;
  313.     int x, y, nsides, pageno, side;
  314.     float sx, sy, spdx, spdy, pdx2;
  315.  
  316.  
  317.     pdx2 = 2*pdx;
  318.     spdx = SHEIGHT;
  319.     spdy = SWIDTH;
  320.     nx = (spdx-SPMARGIN)/(pdx2+SPMARGIN);
  321.     ny = (spdy-SPMARGIN)/(pdy+SPMARGIN);
  322.     sx = (spdx-nx*pdx2)/(nx+1);
  323.     sy = (spdy-ny*pdy)/(ny+1);
  324.     spreadsper = nx*ny;
  325.     if(spreadsper <1) {
  326.     fprintf(stderr,"psbook: try a smaller scale factor\n");
  327.     exit(1);
  328.     }
  329.     nspreads = (npages+1)/2;
  330.     nsides = ((nspreads-1)/spreadsper)+1;
  331. fprintf(stderr,"Spread array %d by %d\n",nx,ny);
  332. fprintf(stderr,"Printer sides %d\n",nsides);
  333.  
  334. /* put out the sheets */
  335.     pageno = -1;
  336.     for(side=0; side<nsides; ) {
  337.         printf("%%%%Page: page%d %d\n",side+1,side+1);
  338.       for(y=0; y<ny; y++) {
  339.         for(x=0; x<nx; x++) {
  340.         spreadpage(inf,x,ny-1-y,sx,sy, SPLEFTPAGE,pageno+0,npages);
  341.         spreadpage(inf,x,ny-1-y,sx,sy,SPRIGHTPAGE,pageno+1,npages);
  342.         pageno+=2;
  343.         }
  344.     }
  345.     printf("REALshowpage\n");
  346.     side++;
  347.     }
  348. }
  349.  
  350. void sheettransform0(inf)
  351. FILE *inf;
  352. {
  353. }
  354.  
  355. void fold0(inf,npages)
  356. FILE *inf;
  357. int npages;
  358. {
  359.     int side, nsides, spages, pbase;
  360.     float spdx, spdy;
  361.  
  362.     spdx = SWIDTH;
  363.     spdy = SHEIGHT;
  364.     nsides = npages;
  365.     spages = nsides;
  366. fprintf(stderr,"FOLD 0: Printer sides %d\n",nsides);
  367.  
  368. /* put out the sheets */
  369.     for(side=0; side<nsides; ) {
  370.     pbase = side;
  371.  
  372.         printf("%%%%Page: page%d %d\n",side+1,side+1);
  373.     dosave(inf);
  374.     sheettransform0(inf);
  375.     setclip(inf,CENTERPAGE,spdx,spdy); 
  376.     putpage(inf,pbase,npages);
  377.     dorestore(inf);
  378.  
  379.     printf("REALshowpage\n");
  380.  
  381.     side++;
  382.     }
  383. }
  384.  
  385. void printside(side)
  386. int side;
  387. {
  388.     printf("/Times-Roman findfont 8 scalefont setfont\n");
  389.     printf("72 15 moveto\n");
  390.     if(side == FRONTSIDE) 
  391.     printf("(Front side) show\n");
  392.     else
  393.     printf("(Back side) show\n");
  394. }
  395.  
  396. void sheettransform1(inf,side)
  397. FILE *inf;
  398. int side;
  399. {
  400.     if(side == FRONTSIDE) {
  401.     printf("%f %f translate\n",SWIDTH+FRONTXFUDGE,FRONTYFUDGE);
  402.     printf("90 rotate\n");
  403.     } else {
  404.     printf("%f %f translate\n",BACKXFUDGE,SHEIGHT+BACKYFUDGE);
  405.     printf("-90 rotate\n");
  406.     }
  407. }
  408.  
  409. void fold1(inf,npages)
  410. FILE *inf;
  411. int npages;
  412. {
  413.     int side, nsides, spages, pbase;
  414.     float spdx, spdy;
  415.  
  416.     spdx = SHEIGHT;
  417.     spdy = SWIDTH;
  418.     nsides = ((npages-1)/2)+1;
  419.     if(nsides&1)
  420.     nsides++;
  421.     spages = nsides*2;
  422. fprintf(stderr,"FOLD 1: Printer sides %d\n",nsides);
  423. fprintf(stderr,"Book sheets %d\n",nsides/2);
  424.  
  425. /* put out the sheets */
  426.     for(side=0; side<nsides; ) {
  427.     pbase = side;
  428.  
  429.         printf("%%%%Page: page%d %d\n",side+1,side+1);
  430.     printside(FRONTSIDE);
  431.     dosave(inf);
  432.     sheettransform1(inf,FRONTSIDE);
  433.     setclip(inf,RIGHTPAGE,spdx,spdy);
  434.     putpage(inf,pbase,npages);
  435.     dorestore(inf);
  436.  
  437.     dosave(inf);
  438.     sheettransform1(inf,FRONTSIDE);
  439.     setclip(inf,LEFTPAGE,spdx,spdy);
  440.     putpage(inf,spages-1-pbase,npages);
  441.     dorestore(inf);
  442.  
  443.     printf("REALshowpage\n");
  444.  
  445.         printf("%%%%Page: page%d %d\n",side+1,side+1);
  446.     printside(BACKSIDE);
  447.     dosave(inf);
  448.     sheettransform1(inf,BACKSIDE);
  449.     setclip(inf,LEFTPAGE,spdx,spdy);
  450.     putpage(inf,pbase+1,npages);
  451.     dorestore(inf);
  452.  
  453.     dosave(inf);
  454.     sheettransform1(inf,BACKSIDE);
  455.     setclip(inf,RIGHTPAGE,spdx,spdy);
  456.     putpage(inf,spages-2-pbase,npages);
  457.     dorestore(inf);
  458.  
  459.     printf("REALshowpage\n");
  460.     side+=2;
  461.     }
  462. }
  463.  
  464. void sheettransform2(inf,side,sig)
  465. FILE *inf;
  466. int side, sig;
  467. {
  468.     if(side == FRONTSIDE) 
  469.     printf("%f %f translate\n",FRONTXFUDGE,FRONTYFUDGE);
  470.     else
  471.     printf("%f %f translate\n",BACKXFUDGE,BACKYFUDGE);
  472.     if(sig == TOPSIG) 
  473.     printf("0 %f translate\n",SHEIGHT/2.0);
  474.     else {
  475.     printf("%f %f translate\n",SWIDTH,SHEIGHT/2.0);
  476.     printf("180 rotate\n");
  477.     }
  478.     putfold(SWIDTH/2.0-pdx,0.0,180.0);
  479.     putfold(SWIDTH/2.0+pdx,0.0,0.0);
  480. }
  481.  
  482. void fold2(inf,npages)
  483. FILE *inf;
  484. int npages;
  485. {
  486.     int side, nsides, spages, pbase;
  487.     float spdx, spdy;
  488.  
  489.     spdx = SWIDTH;
  490.     spdy = SHEIGHT/2.0;
  491.     nsides = ((npages-1)/4)+1;
  492.     if(nsides&1)
  493.     nsides++;
  494.     spages = nsides*4;
  495. fprintf(stderr,"FOLD 2: Printer sides %d\n",nsides);
  496. fprintf(stderr,"Book sheets %d\n",nsides/2);
  497.  
  498. /* put out the sides */
  499.     for(side=0; side<nsides; ) {
  500.     pbase = 2*side;
  501.  
  502.         printf("%%%%Page: page%d %d\n",side+1,side+1);
  503.     printside(FRONTSIDE);
  504.     dosave(inf);
  505.     sheettransform2(inf,FRONTSIDE,TOPSIG);
  506.     setclip(inf,RIGHTPAGE,spdx,spdy);
  507.     putpage(inf,pbase,npages);
  508.     dorestore(inf);
  509.  
  510.     dosave(inf);
  511.     sheettransform2(inf,FRONTSIDE,TOPSIG);
  512.     setclip(inf,LEFTPAGE,spdx,spdy);
  513.     putpage(inf,spages-1-pbase,npages);
  514.     dorestore(inf);
  515.  
  516.     dosave(inf);
  517.     sheettransform2(inf,FRONTSIDE,BOTSIG);
  518.     setclip(inf,RIGHTPAGE,spdx,spdy);
  519.     putpage(inf,spages-4-pbase,npages);
  520.     dorestore(inf);
  521.  
  522.     dosave(inf);
  523.     sheettransform2(inf,FRONTSIDE,BOTSIG);
  524.     setclip(inf,LEFTPAGE,spdx,spdy);
  525.     putpage(inf,pbase+3,npages);
  526.     dorestore(inf);
  527.  
  528.     printf("REALshowpage\n");
  529.  
  530.         printf("%%%%Page: page%d %d\n",side+1,side+1);
  531.     printside(BACKSIDE);
  532.     dosave(inf);
  533.     sheettransform2(inf,BACKSIDE,TOPSIG);
  534.     setclip(inf,LEFTPAGE,spdx,spdy);
  535.     putpage(inf,pbase+1,npages);
  536.     dorestore(inf);
  537.  
  538.     dosave(inf);
  539.     sheettransform2(inf,BACKSIDE,TOPSIG);
  540.     setclip(inf,RIGHTPAGE,spdx,spdy);
  541.     putpage(inf,spages-2-pbase,npages);
  542.     dorestore(inf);
  543.  
  544.     dosave(inf);
  545.     sheettransform2(inf,BACKSIDE,BOTSIG);
  546.     setclip(inf,LEFTPAGE,spdx,spdy);
  547.     putpage(inf,spages-3-pbase,npages);
  548.     dorestore(inf);
  549.  
  550.     dosave(inf);
  551.     sheettransform2(inf,BACKSIDE,BOTSIG);
  552.     setclip(inf,RIGHTPAGE,spdx,spdy);
  553.     putpage(inf,pbase+2,npages);
  554.     dorestore(inf);
  555.  
  556.     printf("REALshowpage\n");
  557.     side+=2;
  558.     }
  559. }
  560.  
  561. main(argc,argv)
  562. int argc;
  563. char **argv;
  564. {
  565.     FILE *inf;
  566.     int npages, pagespread, i, dosettrans;
  567.  
  568.     if(argc<3) {
  569.      fprintf(stderr,"\nusage: psbook in.ps pagescale [-pagespread] [-nosettrans]\n");
  570.      fprintf(stderr,"              [-s pagedx pagedy] [-o xoffset yoffset dxoffset] > out.ps\n");
  571.      fprintf(stderr,"\nThis will print two pages on each side of the paper: \n");
  572.      fprintf(stderr,"    psbook in.ps 0.6 > out.ps\n");
  573.      fprintf(stderr,"\nThis will print four pages on each side of the paper: \n");
  574.      fprintf(stderr,"    psbook in.ps 0.45 > out.ps\n");
  575.      fprintf(stderr,"\nThis will print page spreads across each sheet:\n");
  576.      fprintf(stderr,"    psbook in.ps 0.28 -p > out.ps\n");
  577.      fprintf(stderr,"\nSome printers support two sided printing.  Here's the lp command:\n");
  578.      fprintf(stderr,"    lp -o\"duplex 1\" out.ps\n");
  579.      fprintf(stderr,"\n");
  580.      exit(1);
  581.     }
  582.     pscale = atof(argv[2]);
  583.     pwidth = DEFPWIDTH;
  584.     pheight = DEFPHEIGHT;
  585.     pagespread = 0;
  586.     dosettrans = 1;
  587.     for(i=3; i<argc; i++) {
  588.     if(argv[i][0] == '-') {
  589.         switch(argv[i][1]) {
  590.         case 'p':
  591.             pagespread = 1;
  592.             break;
  593.         case 's':
  594.             i++;
  595.             pwidth = 72.0*atof(argv[i]);
  596.             i++;
  597.             pheight = 72.0*atof(argv[i]);
  598.             break;
  599.         case 'o':
  600.             i++;
  601.             xoffset = 72.0*atof(argv[i]);
  602.             i++;
  603.             yoffset = 72.0*atof(argv[i]);
  604.             i++;
  605.             dxoffset = 72.0*atof(argv[i]);
  606.             break;
  607.         case 'n':
  608.             dosettrans = 0;
  609.             break;
  610.         }
  611.     }    
  612.     }
  613.     if(pscale<0.001 || pscale > 10.0) {
  614.     fprintf(stderr,"page scale should be between 0.001 and 1.0!!\n");
  615.     exit(1);
  616.     }
  617.     inf = fopen(argv[1],"r");
  618.     if(!inf) {
  619.      fprintf(stderr,"psbook: can't open %s\n",argv[1]);
  620.      exit(1);
  621.     }
  622.     npages = indexpages(inf);
  623.  
  624.     fprintf(stderr,"Document pages %d\n",npages);
  625.  
  626. #ifdef DEBUG
  627.     for(i=0; i<npages; i++) 
  628.     fprintf(stderr,"page %d start %d finish %d\n",i,secstart[i],secend[i]);
  629.     fprintf(stderr,"trailstart %d trailend %d\n",trailstart,trailend);
  630. #endif
  631.  
  632.     if(npages == 0) {
  633.     secend[0] = sizeoffile(inf);
  634.     secstart[0] = 0;
  635.     npages = 1;
  636.     } 
  637.  
  638. /* put out the master preamble */
  639.     psoutfile(stdout);
  640.     printheader(dosettrans);
  641.     printf("gsave\n");
  642.     pdx = pwidth*pscale;
  643.     pdy = pheight*pscale;
  644.     if(pagespread) {
  645.     spread(inf,npages);
  646.     } else {
  647.     if((pdx>FOLD1DX) || (pdy>FOLD1DY))
  648.         fold0(inf,npages);
  649.     else if((pdx>FOLD2DX) || (pdy>FOLD2DY))
  650.         fold1(inf,npages);
  651.     else
  652.         fold2(inf,npages);
  653.     }
  654.     printf("grestore\n");
  655.     printf("%%%%EOF\n");
  656.     exit(0);
  657. }
  658.  
  659.